home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 004 (1987-02-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 004 (1987-02-15)(Ossowski, Stefan)(DE)(PD).adf / MandelVroom / IFF / saveilbm.c < prev    next >
C/C++ Source or Header  |  1987-03-04  |  4KB  |  153 lines

  1. /***************************************************************************
  2. *  SaveILBM.c --  Save screen as ILBM file
  3. *
  4. *                 Modified version of Carolyn Scheppner's ScreenSave program
  5. *
  6. *     Using IFF rtns by J.Morrison and S.Shaw of Electronic Arts
  7. *
  8. ***************************************************************************/
  9.  
  10. #include "SaveILBM.h"
  11.  
  12. /* CAMG Stuff */
  13. typedef struct {
  14.    ULONG ViewModes;
  15.    } CamgChunk;
  16.  
  17. #define PutCAMG(context, camg)  \
  18.     PutCk(context, ID_CAMG, sizeof(CamgChunk),(BYTE *)camg)
  19.  
  20. #define bufSize 512
  21.  
  22. extern struct IntuitionBase *IntuitionBase;
  23. extern struct Screen *screen;
  24. extern struct Window *MandWind;
  25.  
  26. struct Screen   *frontScreen;
  27.  
  28. struct ViewPort *picViewPort;
  29. struct BitMap   *picBitMap;
  30. WORD            *picColorTable;
  31. ULONG            picViewModes;
  32.  
  33. /**************************************************************************
  34.  *
  35.  *  Save the current screen as an ILBM file
  36.  *
  37.  *************************************************************************/
  38. SaveILBM(FileName)
  39.   char *FileName;
  40. {
  41.   LONG            file;
  42.   IFFP            iffp = NO_FILE;
  43.  
  44.   int l;
  45.  
  46.   WindowToFront(MandWind);
  47.  
  48.   if (!(file = Open(FileName, MODE_NEWFILE))) {
  49.     printf("Can't open file %s\n",FileName);
  50.     return(0);
  51.   }
  52.  
  53.   Write(file,"x",1);  /* 1.1 so Seek to beginning works ? */
  54.  
  55.   frontScreen  = screen;
  56.  
  57.   picViewPort =  &( frontScreen->ViewPort );
  58.   picBitMap =     (struct BitMap*)picViewPort->RasInfo->BitMap;
  59.   picColorTable = (WORD *)picViewPort->ColorMap->ColorTable;
  60.   picViewModes =  (ULONG)picViewPort->Modes;
  61.  
  62.   iffp = PutPicture(file, picBitMap, picColorTable, picViewModes);
  63.   Close(file);
  64.  
  65.   if (iffp == IFF_OKAY) {
  66.     printf("Screen saved\n");
  67.   }
  68.   printf("Done\n");
  69. } /* SaveILBM */
  70.  
  71.  
  72. /** PutPicture() ***********************************************************
  73.  *
  74.  * Put a picture into an IFF file.
  75.  * This procedure calls PutAnILBM, passing in an <x, y> location of <0, 0>,
  76.  * a NULL mask, and a locally-allocated buffer. It also assumes you want to
  77.  * write out all the bitplanes in the BitMap.
  78.  *
  79.  ***************************************************************************/
  80. Point2D nullPoint = {0, 0};
  81.  
  82. IFFP PutPicture(file, bitmap, colorMap, viewmodes)
  83.       LONG file;  struct BitMap *bitmap;
  84.       WORD *colorMap;  ULONG viewmodes;
  85.    {
  86.    BYTE buffer[bufSize];
  87.    return( PutAnILBM(file, bitmap, NULL,
  88.            colorMap, bitmap->Depth, viewmodes,
  89.            &nullPoint, buffer, bufSize) );
  90.    }
  91.  
  92.  
  93. /** PutAnILBM() ************************************************************
  94.  *
  95.  * Write an entire BitMap as a FORM ILBM in an IFF file.
  96.  * This version works for any display mode (C. Scheppner).
  97.  *
  98.  * Normal return result is IFF_OKAY.
  99.  *
  100.  * The utility program IFFCheck would print the following outline of the
  101.  * resulting file:
  102.  *
  103.  *   FORM ILBM
  104.  *     BMHD
  105.  *     CAMG
  106.  *     CMAP
  107.  *     BODY       (compressed)
  108.  *
  109.  ***************************************************************************/
  110. #define CkErr(expression)  {if (ifferr == IFF_OKAY) ifferr = (expression);}
  111.  
  112. IFFP PutAnILBM(file, bitmap, mask, colorMap, depth,
  113.                                 viewmodes, xy, buffer, bufsize)
  114.       LONG file;
  115.       struct BitMap *bitmap;
  116.       BYTE *mask;  WORD *colorMap; UBYTE depth;
  117.       ULONG viewmodes;
  118.       Point2D *xy; BYTE *buffer;  LONG bufsize;
  119.    {
  120.    BitMapHeader bmHdr;
  121.    CamgChunk    camgChunk;
  122.    GroupContext fileContext, formContext;
  123.    IFFP ifferr;
  124.    WORD pageWidth, pageHeight;
  125.  
  126.    pageWidth  = (bitmap->BytesPerRow) << 3;
  127.    pageHeight = bitmap->Rows;
  128.  
  129.    ifferr = InitBMHdr(&bmHdr, bitmap, mskNone,
  130.                       cmpByteRun1, 0, pageWidth, pageHeight);
  131.    /* You could write an uncompressed image by passing cmpNone instead
  132.     * of cmpByteRun1 to InitBMHdr. */
  133.    bmHdr.nPlanes = depth;   /* This must be  <= bitmap->Depth */
  134.    if (mask != NULL) bmHdr.masking = mskHasMask;
  135.    bmHdr.x = xy->x;   bmHdr.y = xy->y;
  136.  
  137.    camgChunk.ViewModes = viewmodes;
  138.  
  139.    CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) );
  140.    CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext));
  141.  
  142.    CkErr( PutBMHD(&formContext, &bmHdr) );
  143.    CkErr( PutCAMG(&formContext, &camgChunk) );
  144.    CkErr( PutCMAP(&formContext, colorMap, depth) );
  145.    CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) );
  146.  
  147.    CkErr( EndWGroup(&formContext) );
  148.    CkErr( CloseWGroup(&fileContext) );
  149.    return( ifferr );
  150.    }
  151.  
  152.  
  153.